let middleware = [];
middleware.push((next) => {
  console.log(1);
  next();
  console.log(1.1);
});
middleware.push((next) => {
  console.log(2);
  next();
  console.log(2.1);
});
middleware.push((next) => {
  console.log(3);
  next();
  console.log(3.1);
});

let fn = compose(middleware);
fn();

// 题目实现上面
//  然后输出结果是
/**
 *
 * @param {Array} middleware 事件数组
 * @returns
 *
 *
 * 1
2
3
3.1
2.1
1.1

 */
function compose(middleware) {
  // 搞定！！！
  return function () {
    function nextFunu() {
      const fn = middleware.shift();
      fn && fn(nextFunu);
    }
    // 将next 方法放进宏任务中，所以，next之后的之后才执行
    setTimeout(() => {
      nextFunu();
    }, 0);
  };
}

// 其他例子
console.log(typeof typeof null); // string 主要把基础弄熟了就可以了
console.log(typeof console.log(1)); // undefined console.log 是没有输出值的，所以，这里是 undefined
